不管哪一種語言都具備流程控制的功能,用來控制程式執行與流程的流向,透過流程控制可以讓程式更容易維護。
這次我們要討論經常與 WHILE 合用的兩個 T-SQL 陳述式:BREAK 與 CONTINUE。
BREAK 陳述式可以從最內層的 WHILE 迴圈離開,而 CONTINUE 陳述式則是重新執行 WHILE 迴圈。換句話說,就是當找不到符合的資料時,程式會執行 BREAK 的那段陳述式;而如果需要繼續執行程式碼,自然就會執行 CONTINUE 那段陳述式。
先來個簡單的例子,計算從 1 加到 100 的總和好了:
-- 定義變數
DECLARE @count int, @sum int
-- 指定初始值
SET @count = 0
SET @sum = 0
-- 開始計算
WHILE (@count < 101)
BEGIN
SET @sum = @sum + @count
SET @count = @count + 1
END
-- 顯示結果
SELECT @sum 總和
執行結果如下:
通常我們會在 WHILE 迴圈中,使用 @@FETCH_STATUS 判斷是否要繼續從 CURSOR 中,抓資料出來:
USE AdventureWorks
GO
-- 定義變數
DECLARE @Name nvarchar(50)
-- 定義 CURSOR
DECLARE myCursor CURSOR FOR
SELECT [Name] FROM Sales.Store
-- 開啟 CURSOR
OPEN myCursor
-- 抓出資料
FETCH NEXT FROM myCursor
INTO @Name
-- 檢查 @@FETCH_STATUS 來決定是否要繼續執行
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT N'商店名稱:' + @Name
FETCH NEXT FROM myCursor
INTO @Name
END
-- 關閉 CURSOR
CLOSE myCursor
-- 釋放 CURSOR
DEALLOCATE myCursor
執行的部分結果如下:
最後來看一個把 SELECT 的查詢結果作為 WHILE 迴圈的條件,然後再使用 BREAK 與 CONTINUE 來決定是要離開迴圈或是繼續執行迴圈:
USE AdventureWorks
GO
-- 建立一個測試用的資料表
SELECT [Name], ListPrice INTO myTable
FROM Production.Product
-- 未調價前的平均價格
SELECT 調價前的平均價格 = AVG(ListPrice) FROM myTable
-- 如果平均單價小於 450,則提高 2 倍價格
WHILE (SELECT AVG(ListPrice) FROM myTable) < $450
BEGIN
UPDATE myTable
SET ListPrice = ListPrice * 2
-- 找出最高的價格
SELECT 最高的價格 = MAX(ListPrice) FROM myTable
-- 如果最高價格超過 800,就不再調價
-- 如果沒有超過 800,還要繼續調價
IF (SELECT MAX(ListPrice) FROM myTable) > $800
BREAK
ELSE
CONTINUE
END
SELECT 調價後的平均價格 = AVG(ListPrice) FROM myTable
-- 刪掉測試用的資料表
DROP TABLE myTable
執行結果如下: